package com.taxi.driver.module.pay;

import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;

import com.alipay.sdk.app.PayTask;
import com.qianxx.utils.ToastUtil;
import com.taxi.driver.data.entity.PayResult;
import com.taxi.driver.event.PayEvent;

import org.greenrobot.eventbus.EventBus;

/**
 * 支付宝支付，工具类
 */
public class AlipayUtils {

    private static Context mContext;
    private static AlipayUtils instance;

    public static AlipayUtils getInstance(Context context) {
        mContext = context;
        if (instance == null) {
            synchronized (AlipayUtils.class) {
                if (instance == null) {
                    instance = new AlipayUtils();
                }
            }
        }

        return instance;
    }

    private static final int SDK_PAY_FLAG = 1;
    private static final int SDK_CHECK_FLAG = 2;

    private Handler payHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    PayResult payResult = new PayResult((String) msg.obj);
                    // 支付宝返回此次支付结果及加签，建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
                    //String resultInfo = payResult.getResult();
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 支付成功
                        EventBus.getDefault().post(new PayEvent(PayEvent.PAY_SUCCESS));

                    } else {
                        // 判断resultStatus 为非“9000”则代表可能支付失败
                        // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                        if (TextUtils.equals(resultStatus, "8000")) {
                            ToastUtil.getInstance().toast("支付结果确认中");

                        } else {
                            // 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
                            // 支付失败
                            EventBus.getDefault().post(new PayEvent(PayEvent.PAY_FAIL));
                            if (!TextUtils.equals(resultStatus, "6004")) {
                                EventBus.getDefault().post(new PayEvent(PayEvent.PAY_REMOVE));
                            }
                        }
                    }
                    break;
                }
                case SDK_CHECK_FLAG: {
                    ToastUtil.getInstance().toast("检查结果为：" + msg.obj);
                    break;
                }
                default:
                    break;
            }
        }

        ;
    };

    /**
     * 支付车费
     */
    public void pay(String tradeUrl) {
        startPay(tradeUrl);
    }

    private void startPay(final String payInfo) {
        Runnable payRunnable = () -> {
            // 构造PayTask 对象
            PayTask alipay = new PayTask((Activity) mContext);
            // 调用支付接口，获取支付结果
            String result = alipay.pay(payInfo);

            Message msg = new Message();
            msg.what = SDK_PAY_FLAG;
            msg.obj = result;
            payHandler.sendMessage(msg);
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

}
